package cn.csc.module.product.service.category;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.module.product.api.category.dto.CategoryRespDTO;
import cn.csc.module.product.controller.admin.category.vo.CategoryCreateReqVO;
import cn.csc.module.product.controller.admin.category.vo.CategoryExportReqVO;
import cn.csc.module.product.controller.admin.category.vo.CategoryPageReqVO;
import cn.csc.module.product.controller.admin.category.vo.CategoryUpdateReqVO;
import cn.csc.module.product.controller.app.category.vo.AppCategoryProductRespVO;
import cn.csc.module.product.controller.app.category.vo.AppCategorySearchReqVO;
import cn.csc.module.product.dal.dataobject.category.CategoryDO;

import javax.validation.Valid;
import java.math.BigInteger;
import java.util.Collection;
import java.util.List;

/**
 * 分类信息 Service 接口
 *
 * @author liuchuang
 */
public interface CategoryService {

    /**
     * 创建分类信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    BigInteger createCategory(@Valid CategoryCreateReqVO createReqVO);

    /**
     * 更新分类信息
     *
     * @param updateReqVO 更新信息
     */
    void updateCategory(@Valid CategoryUpdateReqVO updateReqVO);

    /**
     * 删除分类信息
     *
     * @param id 编号
     */
    void deleteCategory(BigInteger id);

    /**
     * 获得分类信息
     *
     * @param id 编号
     * @return 分类信息
     */
    CategoryDO getCategory(BigInteger id);

    /**
     *  获取分类的pathName集合
     * @param categorys 分类集合
     */
    void getPathNames(List<CategoryDO> categorys);

    /**
     * 获得分类信息列表
     *
     * @param ids 编号
     * @return 分类信息列表
     */
    List<CategoryDO> getCategoryList(Collection<BigInteger> ids);

    /**
     * 获得分类信息分页
     *
     * @param pageReqVO 分页查询
     * @return 分类信息分页
     */
    PageResult<CategoryDO> getCategoryPage(CategoryPageReqVO pageReqVO);

    /**
     * 获得分类信息列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 分类信息列表
     */
    List<CategoryDO> getCategoryList(CategoryExportReqVO exportReqVO);


    List<BigInteger> listCategoryId(BigInteger shopId, BigInteger parentId);


    List<CategoryRespDTO> listByShopIdAndParenId(BigInteger shopId, BigInteger parentId);

    List<CategoryRespDTO> listByShopIdAndLevel(BigInteger shopId, Integer level);

    List<CategoryRespDTO> listByShopIdAndProduct(BigInteger shopId);

    List<CategoryDO> listByParenId(CategoryCreateReqVO reqVO);

    List<CategoryRespDTO> recommendList();

    List<CategoryRespDTO> topItemList(BigInteger id);

    List<CategoryRespDTO> selectCategoryByLevel(AppCategorySearchReqVO reqVO);

    List<CategoryRespDTO>  markLable(CategoryCreateReqVO categoryCreateReqVO);

    AppCategoryProductRespVO geCategoryById(AppCategorySearchReqVO reqVO);
}
